package com.company.gjtx.common.dao;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;

import com.company.gjtx.common.exception.DaoException;
import com.company.gjtx.common.util.PageView;

public interface GenericDao<T, ID extends Serializable> {
	/**
	 * 在查找所有记录的时候,使用提供查询语句,查询匹配的记录,否则将使用默认的查询语句查询数据的所有记录.
	 * 
	 * @param hql :
	 *            自定义的HQL语句
	 */
	public void setHql(String hql);

	/**
	 * 获取自定义的HQL语句
	 * 
	 * @return 自定义的HQL语句
	 */
	public String getHql();

	/**
	 * 保存实体
	 * 
	 * @param entity :
	 *            需要保存到数据库的实体
	 * @return 保存后得到的id
	 */
	public ID save(T entity) throws DaoException;

	/**
	 * 保存或修改实体
	 * 
	 * @param entity :
	 *            需要保存或修改到数据库的实体
	 */
	public void saveOrUpdate(T entity) throws DaoException;

	/**
	 * 保存或修改实体
	 * 
	 * @param entities :
	 *            需要保存或修改到数据库的实体集合
	 */
	public void saveOrUpdateAll(Collection<T> entities) throws DaoException;

	/**
	 * 用hql单独更新某些属性
	 * 
	 * @return
	 * @throws DaoException
	 */
	public Integer updateAllByHql() throws DaoException;

	/**
	 * 删除实体
	 * 
	 * @param entity :
	 *            需要从数据库删除的实体
	 */
	public void remove(T entity) throws DaoException;

	/**
	 * 删除实体集合
	 * 
	 * @param entities :
	 *            需要从数据库删除的实体集合
	 */
	public void removeAll(Collection<T> entities) throws DaoException;

	/**
	 * 修改实体
	 * 
	 * @param entity :
	 *            需要从数据库更新的实体
	 */
	public void modify(T entity) throws DaoException;

	/**
	 * 通过ID查找
	 * 
	 * @param id :
	 *            实体的ID
	 * @return 找到的实体
	 */
	public T findById(ID id) throws DaoException;

	/**
	 * 查找全部实体
	 * 
	 * @return 找到的所有实体的集合
	 */
	public List<T> findAll() throws DaoException;

	/**
	 * 通过设置的HQL，查找全部实体
	 * 
	 * @return 找到的所有实体的集合
	 * @throws DaoException
	 */
	public List<T> findAllByHql() throws DaoException;

	/**
	 * 计算匹配查询条件的记录总数,根据注入或者设置hql语句,获取查询语句返回数据库中所有记录
	 * 
	 * @return 记录总数
	 */
	public int getTotalRows() throws DaoException;

	/**
	 * 根据每页记录的数量,计算出总的分页数
	 * 
	 * @param size
	 *            每页记录的数量
	 * @return 分页总数
	 */
	public int getPageSize(int size) throws DaoException;

	/**
	 * 根据给定的页码进行分页查找,这是纯Hibernate分页.
	 * 
	 * @param pageView *
	 *            :分页对象
	 * 
	 * @return 匹配的实体列表集合
	 */
	public PageView<T> findByPage(PageView<T> pageView) throws DaoException;

	/**
	 * 根据给定的页码进行分页查找,这是纯Hibernate分页.
	 * 
	 * @param pageView
	 * @return
	 * @throws DaoException
	 */
	public PageView<T> findByPageEx(PageView<T> pageView) throws DaoException;

	/***************************************************************************
	 * 根据SQL查询
	 * 
	 * @param sql
	 * @return
	 * @throws DaoException
	 */
	public <Object> List<Object> findBySql(final String sql)
			throws DaoException;

	/***************************************************************************
	 * 根据SQL 以及绑定的类查询
	 * 
	 * @param sql
	 * @param clazz
	 * @return
	 * @throws DaoException
	 */
	public <Object> List<Object> findBySql(final String sql, final Class clazz)
			throws DaoException;

}